﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BatallaNavalgo.Tests
{
    [TestClass]
    public class TestMinaDoble
    {
        MinaDoble mina;
        public TestMinaDoble()
        {
            mina = new MinaDoble(2);
        }

        [TestMethod]
        public void TestMinaDobleDebeIndicarQueSuCostoEsDe100()
        {
            Assert.AreEqual(100, mina.Costo);
        }

        [TestMethod]
        public void TestMinaDobleDebeIndicarFalseParaInformarQueDebeImpactarEnEseTurno()
        {
            Assert.IsFalse(mina.DebeImpactar());
        }

        [TestMethod]
        public void TestMinaDobleDebeImpactarAlFragmentoDeNaveDeUnaLanchaHabiendoPasadoTresTurnos()
        {
            int orientacion = 0;
            mina.PasarDeTurno();
            mina.PasarDeTurno();
            int[] posicion = new int[2];
            Tablero tablero = new Tablero();
            posicion[0] = 0;
            posicion[1] = 1;
            int[] direccion = new int[2];
            direccion[0] = 0;
            direccion[1] = 1;
            Lancha lancha = new Lancha(posicion, direccion, orientacion, tablero);
            FragmentoDeNave[] fragmentos = lancha.Fragmentos;
            mina.Impactar(lancha, fragmentos[0]);
            Assert.IsTrue(fragmentos[0].EstaDestruido());
        }

        [TestMethod]
        public void TestMinaDobleDebeImpactarAlFragmentoDeNaveDeUnDestructor()
        {
            int orientacion = 0;
            mina.PasarDeTurno();
            mina.PasarDeTurno();
            int[] posicion = new int[2];
            Tablero tablero = new Tablero();
            posicion[0] = 0;
            posicion[1] = 1;
            int[] direccion = new int[2];
            direccion[0] = 0;
            direccion[1] = 1;
            Destructor destructor = new Destructor(posicion, direccion,orientacion, tablero);
            FragmentoDeNave[] fragmentos = destructor.Fragmentos;
            mina.Impactar(destructor, fragmentos[0]);
            Assert.IsTrue(fragmentos[0].EstaDestruido());
        }

        [TestMethod]
        public void TestMinaDobleDebeDestruirTodosLosFragmentosDelBuqueAlImpactarConUnFragmentoHabiendoPasadoPreviamenteTresTurnos()
        {
            int orientacion = 0;
            mina.PasarDeTurno();
            mina.PasarDeTurno();
            int[] posicion = new int[2];
            Tablero tablero = new Tablero();
            posicion[0] = 0;
            posicion[1] = 1;
            int[] direccion = new int[2];
            direccion[0] = 0;
            direccion[1] = 1;
            Buque buque = new Buque(posicion, direccion, orientacion, tablero);
            FragmentoDeNave[] fragmentos = buque.Fragmentos;
            mina.Impactar(buque, fragmentos[0]);
            for (int i = 0; i < 4; i++)
            {
                Assert.IsTrue(fragmentos[i].EstaDestruido());
            }
        }

        [TestMethod]
        public void TestMinaDobleDebeImpactarAlFragmentoDeNaveDeUnPortaAvionesHabiendoPasadoTresTurnos()
        {
            int orientacion = 0;
            mina.PasarDeTurno();
            mina.PasarDeTurno();
            int[] posicion = new int[2];
            Tablero tablero = new Tablero();
            posicion[0] = 0;
            posicion[1] = 1;
            int[] direccion = new int[2];
            direccion[0] = 0;
            direccion[1] = 1;
            PortaAviones portaAviones = new PortaAviones(posicion, direccion, orientacion, tablero);
            FragmentoDeNave[] fragmentos = portaAviones.Fragmentos;
            mina.Impactar(portaAviones, fragmentos[0]);
            Assert.IsTrue(fragmentos[0].EstaDestruido());
        }

        [TestMethod]
        public void TestMinaDobleDebeImpactarAlFragmentoDeNaveDeUnRompeHielosHabiendoPasado3Turnos()
        {
            int orientacion = 0;
            mina.PasarDeTurno();
            mina.PasarDeTurno();
            int[] posicion = new int[2];
            Tablero tablero = new Tablero();
            posicion[0] = 0;
            posicion[1] = 1;
            int[] direccion = new int[2];
            direccion[0] = 0;
            direccion[1] = 1;
            RompeHielos rompeHielos = new RompeHielos(posicion, direccion,orientacion, tablero);
            FragmentoDeNave[] fragmentos = rompeHielos.Fragmentos;
            mina.Impactar(rompeHielos, fragmentos[0]);
            Assert.IsFalse(fragmentos[0].EstaDestruido());
        }


    }
}